home *** CD-ROM | disk | FTP | other *** search
/ Aminet 22 / Aminet 22 (1997)(GTI - Schatztruhe)[!][Dec 1997].iso / Aminet / dev / src / ConfigFileSrc.lha / ConfigFileSrc12 / Library / LibCode.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-10-02  |  3.9 KB  |  226 lines

  1. /*
  2. **        $PROJECT: ConfigFile.library
  3. **        $FILE: LibCode.c
  4. **        $DESCRIPTION: Code for library init, open and close.
  5. **
  6. **        (C) Copyright 1996-1997 Marcel Karas
  7. **             All Rights Reserved.
  8. */
  9.  
  10. LibCall struct CFBase *    LibInit ( REGA0 BPTR, REGD0 struct CFBase *, REGA6 struct ExecBase * );
  11. LibCall struct CFBase * LibOpen ( REGA6 struct CFBase * );
  12. LibCall BPTR                LibExpunge ( REGA6 struct CFBase * );
  13. LibCall BPTR                LibClose ( REGA6 struct CFBase * );
  14. LONG                             LibNull ( VOID );
  15.  
  16. extern UBYTE __far    LibName[],
  17.                             LibID[];
  18.  
  19. struct ExecBase    * SysBase = 0;
  20. struct DosLibrary    * DOSBase = 0;
  21. struct Library        * UtilityBase = 0;
  22.  
  23. APTR LibVectors[] =
  24. {
  25.     LibOpen,
  26.     LibClose,
  27.     LibExpunge,
  28.     LibNull,
  29.  
  30.     cf_Open,
  31.     cf_Close,
  32.  
  33.     cf_Read,
  34.     cf_Write,
  35.  
  36.     cf_AddGroup,
  37.     cf_AddArgument,
  38.     cf_AddItem,
  39.  
  40.     cf_NewGroup,
  41.     cf_NewArgument,
  42.     cf_NewItem,
  43.     cf_NewArgItem,
  44.  
  45.     cf_DisposeGroup,
  46.     cf_DisposeArgument,
  47.     cf_DisposeItem,
  48.  
  49.     cf_CloneGroup,
  50.     cf_CloneArgument,
  51.     cf_CloneItem,
  52.  
  53.     cf_RemoveGroup,
  54.     cf_RemoveArgument,
  55.     cf_RemoveItem,
  56.  
  57.     cf_ClearGrpList,
  58.     cf_ClearArgList,
  59.     cf_ClearItemList,
  60.  
  61.     cf_ChangeGroup,
  62.     cf_ChangeArgument,
  63.     cf_ChangeItem,
  64.  
  65.     cf_FindGroup,
  66.     cf_FindArgument,
  67.     cf_FindItem,
  68.  
  69.     cf_GetItem,
  70.     cf_GetItemNum,
  71.  
  72.     cf_LockGrpList,
  73.     cf_LockArgList,
  74.     cf_LockItemList,
  75.  
  76.     cf_UnlockGrpList,
  77.     cf_UnlockArgList,
  78.     cf_UnlockItemList,
  79.  
  80.     cf_NextGroup,
  81.     cf_NextArgument,
  82.     cf_NextItem,
  83.  
  84.     cf_LastGroup,
  85.     cf_LastArgument,
  86.     cf_LastItem,
  87.  
  88.     cf_OpenPS,
  89.  
  90.     cf_GetItemType,
  91.     cf_GetItemSType,
  92.  
  93.     cf_GetGrpName,
  94.     cf_GetArgName,
  95.  
  96.     cf_GetHdrOfGrp,
  97.     cf_GetGrpOfArg,
  98.     cf_GetArgOfItem,
  99.  
  100.     cf_GetItemOnly,
  101.  
  102.     (APTR)-1
  103. };
  104.  
  105. struct { ULONG DataSize; APTR Table; APTR Data; struct CFBase * (*Init)(); }
  106. __aligned LibInitTab =
  107. {
  108.     sizeof(struct CFBase),
  109.     LibVectors,
  110.     NULL,
  111.     LibInit
  112. };
  113.  
  114.     /* LibInit():
  115.      *
  116.      *    Initialize the library.
  117.      */
  118.  
  119. LibCall struct CFBase *
  120. LibInit ( REGA0 BPTR LibSegment, REGD0 struct CFBase * CFBase, REGA6 struct ExecBase * ExecBase )
  121. {
  122.     CFBase->LibNode.lib_Node.ln_Type    = NT_LIBRARY;
  123.     CFBase->LibNode.lib_Node.ln_Name    = LibName;
  124.     CFBase->LibNode.lib_Node.ln_Pri    = 100;
  125.     CFBase->LibNode.lib_Flags            = LIBF_CHANGED | LIBF_SUMUSED;
  126.     CFBase->LibNode.lib_Version        = VERSION;
  127.     CFBase->LibNode.lib_Revision        = REVISION;
  128.     CFBase->LibNode.lib_IdString        = LibID;
  129.  
  130.     CFBase->Segment = LibSegment;
  131.  
  132.     SysBase = ExecBase;
  133.  
  134.     if ( SysBase->LibNode.lib_Version < 36 )
  135.         return (NULL);
  136.  
  137.     return (CFBase);
  138. }
  139.  
  140.     /* LibOpen():
  141.      *
  142.      *    Open the library, as called via OpenLibrary()
  143.      */
  144.  
  145. LibCall struct CFBase *
  146. LibOpen ( REGA6 struct CFBase * CFBase )
  147. {
  148.     CFBase->LibNode.lib_OpenCnt++;
  149.     CFBase->LibNode.lib_Flags &= ~LIBF_DELEXP;
  150.  
  151.     if ( CFBase->LibNode.lib_OpenCnt == 1 )
  152.     {
  153.         DOSBase        = TaggedOpenLibrary (TLIB_DOS);
  154.         UtilityBase    = TaggedOpenLibrary (TLIB_UTILITY);
  155. /*
  156.         Printf ("sizeof(iCFHeader)   = %ld\n", sizeof(iCFHeader));
  157.         Printf ("sizeof(iCFGroup)    = %ld\n", sizeof(iCFGroup));
  158.         Printf ("sizeof(iCFArgument) = %ld\n", sizeof(iCFArgument));
  159.         Printf ("sizeof(iCFItem)     = %ld\n", sizeof(iCFItem));
  160. */
  161.         return (CFBase);
  162.     }
  163.     else
  164.         return (CFBase);
  165. }
  166.  
  167.     /* LibExpunge();
  168.      *
  169.      *    Expunge the library, remove it from memory
  170.      */
  171.  
  172. LibCall BPTR
  173. LibExpunge ( REGA6 struct CFBase * CFBase )
  174. {
  175.     if ( !CFBase->LibNode.lib_OpenCnt ) // If OpenCnt Null
  176.     {
  177.         BPTR TempSegment = CFBase->Segment;
  178.  
  179.         Remove (CFBase);
  180.  
  181.         FreeMem ((BYTE *)CFBase-CFBase->LibNode.lib_NegSize,
  182.                     CFBase->LibNode.lib_NegSize+CFBase->LibNode.lib_PosSize);
  183.  
  184.         return (TempSegment);
  185.     }
  186.     else
  187.     {
  188.         CFBase->LibNode.lib_Flags |= LIBF_DELEXP;
  189.  
  190.         return (NULL);
  191.     }
  192. }
  193.  
  194.     /* LibClose();
  195.      *
  196.      *    Close the library, as called by CloseLibrary()
  197.      */
  198.  
  199. LibCall BPTR
  200. LibClose ( REGA6 struct CFBase *CFBase )
  201. {
  202.     if ( CFBase->LibNode.lib_OpenCnt )
  203.         CFBase->LibNode.lib_OpenCnt --;
  204.  
  205.     if ( !CFBase->LibNode.lib_OpenCnt )
  206.     {
  207.         CloseLibrary (DOSBase);
  208.         CloseLibrary (UtilityBase);
  209.  
  210.         if ( CFBase->LibNode.lib_Flags & LIBF_DELEXP )
  211.             return (LibExpunge (CFBase));
  212.     }
  213.  
  214.     return (NULL);
  215. }
  216.  
  217.     /* LibNull();
  218.      *
  219.      *    Mandatory dummy function
  220.      */
  221.  
  222. LONG LibNull (VOID)
  223. {
  224.     return (NULL);
  225. }
  226.